# 列表
name_list = ['Tom','Lily','Rose']
print(name_list[0])
print(name_list[1])
print(name_list[2])

# 函数
# index(): 返回指定数据所在位置的下标
print(name_list.index('Lily',0,2))

# count(): 统计指定数据在当前列表中出现的次数。
print(name_list.count('Rose'))

# len(): 访问列表长度,即列表中数据的个数。
print(len(name_list))

# in: 判断指定数据在某个列表序列,如果在返回True,否则返回False
print('Lily' in name_list)
print('Lilys' in name_list)

# not in: 判断指定数据不在某个列表序列,如果不在返回True, 否则返回False
print('Lily' not in name_list)
print('Lilyk' not in name_list)

# 需求: 查找用户输入的名字是否已经存在。
name_list = ['Tom','Lily','Rose']
# name = input('请输入您要搜索的名字:')
# if name in name_list:
#     print(f'您输入的名字是{name},名字已经存在')
# else:
#     print(f'您输入的名字是{name},名字不存在')

# append(): 列表结尾追加数据。
name_list.append('小明')
print(name_list)

# 如果append()追加的数据是一个序列, 则追加整个序列到列表
name_list.append(['11','22'])
print(name_list)

# extend():列表结尾追加数据, 如果数据是一个序列,则将这个序列的数据逐一添加到列表。
name_list.extend('xiaoming')
print(name_list)
name_list.extend(['xiaomong','xiaogang'])
print(name_list)

# insert(): 指定位置新增数据。
name_list.insert(1,'xiaoxiao')
print(name_list)

# 删除
# del
name_list = ['Tom', 'Lily', 'Rose']
# del name_list
# print(name_list)
del name_list[0]
print(name_list)

# pop(): 删除指定下标的数据(默认为最后一个),并返回该数据
popname=name_list.pop(1)
print(popname)

# remove(): 移除列表中某个数据的第一个匹配项
name_list = ['Tom', 'Lily', 'Rose']
name_list.remove('Rose')
print(name_list)

# clear(): 清空列表
name_list.clear()
print(name_list)

# 修改
name_list = ['Tom', 'Lily', 'Rose']
name_list[0]='aaa'
print(name_list)

# 逆置: reverse()
num_list = [1, 5, 2, 3, 6, 8]

num_list.reverse()
print(num_list)

# 逆置: reversed()
num_list = [1, 5, 2, 3, 6, 8]
res =reversed(num_list)
print(res)
num_list=list(res)
print(num_list)

# 排序: sort()
num_list = [1, 5, 2, 3, 6, 8]
num_list.sort()
print(num_list)

# 排序:sorted()
num_list = [1, 5, 2, 3, 6, 8]
num=sorted(num_list)
print(num)
print(num_list)

# 函数:copy()
name_list = ['Tom', 'Lily', 'Rose']
name=name_list.copy()
print(name)

# 遍历
# 需求:依次打印列表中的各个数据。
name_list = ['Tom', 'Lily', 'Rose']
i=0
while i <len(name_list):
    print(name_list[i])
    i +=1

for i in name_list:
    print(i)

# 列表嵌套
name_list = [['小明', '小红', '小绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四','王五']]
# 第一步：按下标查找到李四所在的列表
print(name_list[2])
# 第二步：从李四所在的列表里面，再按下标找到数据李四
print(name_list[2][1])

# 元组
# 单个元组
t1=(10,)
# 多个元组
t1=(10,10,10)

t2=(10,)
print(type(t2))
t3=(20)
print(type(t2))
t4 =('hello')
print(type(t4))

# 按下标查找数据
tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1[1])

# index(): 查找某个数据, 如果数据存在返回对应的下标, 否则报错, 语法和列表、字符串的index方法相同。
print(tuple1.index('aa'))

# count(): 统计某个数据在当前元组出现的次数。
print(tuple1.count('bb'))

# len(): 统计元组中数据的个数
print(len(tuple1))

# 注意: 元组内的直接数据如果修改则立即报错
# tuple1[0]='aaa'

# 但是如果元组里面有列表, 修改列表里面的数据则是支持的, 故自觉很重要。
tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
print(tuple2[2])
tuple2[2][0]='aaaa'
print(tuple2)

# 字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
dict1['name']='Rose'
print(dict1)
dict1['id']=120
print(dict1)

# del()/del: 删除字典或删除字典中指定键值对
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
del dict1['gender']
print(dict1)

# clear(): 清空字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
dict1.clear()
print(dict1)

# 写法:字典序列[key] = 值 注意: 如果key存在则修改这个key对应的值; 如果key不存在则新增此键值对
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1['name'])
# print(dict1['id'])

# get()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.get('name'))
print(dict1.get('id','120'))
print(dict1.get('id'))

# ;keys
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.keys())

# values
print(dict1.values())

# items()
print(dict1.items())

# 遍历字典的key
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key  in dict1.keys():
    print(key)

# 遍历字典的value
for vlue in dict1.values():
    print(vlue)

# 遍历字典的元素
for itme in dict1.items():
    print(itme)

# 遍历字典的键值对
for key,value in dict1.items():
    print(f'{key}={value}')

# 集合
# 集合可以去掉重复数据;集合数据是无序的, 故不支持下标集合只可以存放不可变数据类型
s1 = {10, 20, 30, 40, 50}
print(s1)
s2={10, 30, 20, 10, 30, 40, 30, 50}
print(s2)
s3 = set('abcdefg')
print(s3)
s4 = set()
print(s4)
s5 = {}
print(s5)

# add() 增加
s1={10,20}
s1.add(100)
s1.add(10)
print(s1)

# update(),追加的数据是序列。
s1 = {10, 20}
s1.update([100,200])
s1.update('asd')
print(s1)

# remove(), 删除集合中的指定数据,如果数据不存在则报错。
s1 = {10, 20}
s1.remove(10)
print(s1)
# s1.remove(10)
# print(s1)

# discard(), 删除集合中的指定数据, 如果数据不存在也不会报错。
s1 = {10, 20}
s1.discard(10)
print(s1)
s1.discard(10)
print(s1)

# pop(), 随机删除集合中的某个数据, 并返回这个数据。
s1 = {10, 20, 30, 40, 50}
name=s1.pop()
print(name)
print(s1)

# in: 判断数据在集合序列
# not in: 判断数据不在集合序列
# s1 = {10, 20, 30, 40, 50}
# print(10 in s1)
# print(10 not in s1)

# 公共操作
# 运算符
# 1. 字符串
str1='aa'
str2='bb'
str3=str1+str2
print(str3)

# 2. 列表
list1 = [11, 2]
list2 = [10, 20]
list3=list1+list2
print(list3)

# # 3. 元组
t1 = (1, 2)
t2 = (10, 20)
t3=t1+t2
print(t3)

# 字符串
print('..'*20)

# 列表
list1=['hello']
print(list1*4)

# 元组
t1=('word',)
print(t1 *4)

# in或not in
# 字符串
print('a' in 'abcd')
print('a' not in 'abcd')

# 列表
list1=['a','b','c','d']
print('aa' in t1)
print('aa' not in 't1')

# 元组
t1=('a','b','c','d')
print('aa' in t1)
print('aa' not in t1)

# len()
str1='abcdefg'
print(len(str1))

# 2. 列表
list1 = [10, 20, 30, 40]
print(len(list1))

# 元组
t1=(10,20,30,40,50)
print(len(t1))

# 集合
s1={10,20,30,10}
print(len(s1))

# 字典
dict1={'name':'rose','age':18}
print(len(dict1))

# del()
# 字符串
# str1='abcdefg'
# del str1
# print(str1)

# 列表
list1=[10,20,30,40]
del (list1[0])
print(list1)

# max()
# 字符串
str1 ='abcdefg'
print(max(str1))

# 列表
list1=[10,20,30,40]
print(max(list1))

# min()
# 字符串
str1 ='abcdefg'
print(min(str1))

# 列表
list1=[10,20,30,40]
print(min(list1))

# range()  range()生成的序列不包含end数字。
for i in range(1,10,1):
    print(i)

# enumerate()
list1 = ['a', 'b', 'c', 'd', 'e']
for i in enumerate(list1):
    print(i)
for k ,y in enumerate(list1,start=1):
    print(f'下表是{k},对应的字符是{y}')

# tuple() 作用:将某个序列转换成元组
list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}
print(tuple(list1))
print(tuple(s1))

# list()  作用:将某个序列转换成列表
t1 = ('a', 'b', 'c', 'd', 'e')
s1 = {100, 200, 300, 400, 500}
print(list(t1))
print(list(s1))

#  set() 作用:将某个序列转换成集合
# 集合可以快速完成列表去重,集合不支持下标
list1 = [10, 20, 30, 40, 50, 20]
t1 = ('a', 'b', 'c', 'd', 'e')
print(set(list1))
print(set(t1))

# 推导式
# 列表推导式
# while
list1=[]
i =0
while i < 10:
    list1.append(i)
    i+=1
print(list1)

# for
list1=[]
for i in range(10):
    list1.append(i)
print(list1)

# 列表推导式
list1=[i for i in range(10)]
print(list1)

# 代if的列表推导式
list1=[i for i in range(0,10,2)]
print(list1)

list1=[i for i in range(10) if i % 2 ==0]
print(list1)

list1=[(i,j) for i in range(1,3) for j in range(3)]
print(list1)

# 如下两个列表:
dict1={i:i**2 for i in range(1,5)}
print(dict1)

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']
dict1={list[i]:list2[i] for i  in range(len(list1))}
print(dict1)

counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
count1= {key:value for key,value in counts.items() if value>=200}
print(count1)

# 创建一个集合,数据为下方列表的2次方。
list1 = [1, 1, 2]
set1={i **2 for i in list1}
print(set1)

# 作业
# 1.需求：有三个办公室，8位老老师，8位老师随机分配到3个办公室
import random
# 2、求100以内能被3整除的数，并将作为列表输出
# 3、列表[1,2,3,4,3,4,2,5,5,8,9,7],将此列表去重，得到一个唯一元素的列表  #不允许用强制类型转化
# 4、求斐波那契数列 1 1 2 3 5 8 13 ……
# 5、求100以内的质数（只能被1和它本身整除）
# 6、有一堆字符串“aabbbcddef”打印出不重复的字符串结果：cef #不允许用类型转化
# 7、有一堆字符串，“welocme to super&Test”，打印出superTest，#不能查字符的索引
# 8、有一堆字符串，“welocme to super&Test”，打印出tseT&repus ot ……全部单词原位置反转  #不允许用reverse
# 9、有一堆字符串，“abcdef”，将首尾反转，结果：fedcba，不能使用现有的函数或方法，自己写算法实现,不允许用步长
# 10、有一堆字符串，“aabbbcddef”，输出abcdef # 不允许用set